Ruby 日記 32日目: 定数の探索順位
次のコードを実行するとどうなりますか。
code:gold/ex32/main.rb
class Human
NAME = "Unknown"
def name
NAME
end
end
class Noguchi < Human
NAME = "Hideyo"
end
puts Noguchi.new.name
選択肢:
実行時にエラーとなる
何も表示されない
Unknown と表示される
Hideyo と表示される
解説:
過去の問題で関連しそうなのは
あたりかな?
ざっくり解説すると
NoguchiクラスはHumanクラスを継承している
のでNoguchiクラスのオブジェクトに対してnameメソッド呼ぶことができる
nameメソッド内のNAME変数はHumanクラス内に定義されているのでnameメソッドは"Unknown"を返す
そうか、Humanクラス内のnameメソッドはHumanクラス内のNAME変数を参照するよね。
凡ミスっぽい。
code:sh
# ruby gold/ex32/main.rb
Unknown
/icons/hr.icon
例えばもしもHumanクラスにNAMEが定義されていなかったら?
code:gold/ex32/sample01.rb
class Human
def name
NAME
end
end
class Noguchi < Human
NAME = "Hideyo"
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample01.rb
gold/ex32/sample01.rb:3:in `name': uninitialized constant Human::NAME (NameError)
from gold/ex32/sample01.rb:11:in `<main>'
エラーになるね
/icons/hr.icon
nameメソッドがNoguchiクラスに定義されていたら?
code:gold/ex32/sample02.rb
class Human
NAME = "Unknown"
end
class Noguchi < Human
NAME = "Hideyo"
def name
NAME
end
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample02.rb
Hideyo
Noguchiクラスに定義された"Hideyo"が表示されるね。
/icons/hr.icon
sample02でNoguchiクラスにNAMEが定義されていなかったら?
code:gold/ex32/sample03.rb
class Human
NAME = "Unknown"
end
class Noguchi < Human
def name
NAME
end
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample03.rb
Unknown
NoguchiクラスにNAMEが定義されていないので、継承したHumanクラスを探索し NAME = "Unknown" を発見する
ので、Unknownが表示されるね。